Skip to main content

特定于用户的 G 代码函数

这个 CNC11_CustomFunctions.project 示例项目位于的安装目录中 CODESYS 下面 ..\CODESYS SoftMotion\Examples

此示例说明如何创建自己的函数以用于 G 代码中的表达式。

有关 G 代码中表达式和函数的更多信息,请参阅: 表达式。在这里,您将找到默认支持的所有运算符和函数的列表。

该示例定义了 SEL 操作符来自 IEC 61131-3,因此也可以在 G 代码中使用。

应用程序的结构

与CNC应用程序一样,该应用程序包括路径处理(CNC_PreparePath 程序)和插值(CNC 程序)。由于插值与其他示例没有区别,因此此处将不进一步讨论该主题

在低优先级中,每隔 20 毫秒循环调用路径处理 PathTask。在高优先级中,每 4 毫秒循环调用插值 MotionTask。后台任务 VISU_TASK 是为可视化定义的。

在可视化中,您可以开始处理 G 代码并设置变量的值 $LONGLINE$。G 代码和机器的移动(3D 龙门架)显示在可视化的右侧

G 代码

数控

LET #WIDTH : LREAL
N10 G36 O#WIDTH D SEL($LONGLINE$, 40, 110)
N20 F50 E100 E-100
N30 G01 X#WIDTH Y#WIDTH Z#WIDTH/2
N40 Y-#WIDTH
N50 X-#WIDTH Z-#WIDTH/2
N60 Y#WIDTH
N70 X0 Y0 Z0

第 1 行:局部变量的声明 #WIDTH 类型的 LREAL

第 2 行,区块 N10:赋值 SEL($LONGLINE$, 40, 110) 到变量 #WIDTH。如果 PLC 变量的值 $LONGLINE$TRUE,则表达式的值为 110;否则为 40。

在以下几行中,遍历一个在 Z 方向上有额外移动的矩形;矩形一边的长度为 2*#WIDTH

的实施 SEL 函数

_sm_img_function_sel.png

要创建用户定义的函数,你需要编写一个函数块来实现 SMC_NC_IFunction 接口。

有关更多信息,请参阅: smc_nc_iFunction

. 该接口定义了两种方法:
  1. GetSignature。此处返回函数参数的返回类型、计数和类型。在此示例中, SEL 函数返回类型为的值 T_OTHER 并有 3 个类型的参数 T_BOOLT_OTHER,以及 T_OTHERT_OTHER 代表任何类型(要么 T_BOOLT_LREAL,或 T_STRING]。的所有 3 次出现 T_OTHER 必须具有相同的类型。

    METHOD GetSignature
    VAR_OUTPUT
        resultType : SMC_GVar_Type;
        nNumArguments : UDINT;
        pType : POINTER TO SMC_GVar_Type;
    END_VAR
    VAR    argTypes : ARRAY[0..2] OF SMC_GVar_Type :=
            [SMC_GVar_Type.T_BOOL,
             SMC_GVar_Type.T_OTHER,
             SMC_GVar_Type.T_OTHER];
    END_VAR
    
    resultType := SMC_GVAR_Type.T_OTHER;
    nNumArguments := 3;
    pType := ADR(argTypes);
  2. Call:处理 G 代码时调用此方法。参数是通过传递的 pa 输入。这个表情 pa[0].argValue.bValue 用于访问第一个参数的布尔值。取决于第二个参数的类型 pa[1].argType,结果是返回值 result.argType 然后分支成一个 CASE 语句。

    METHOD Call
    VAR_IN_OUT
        result : SMC_NC_GArgument;
    END_VAR
    VAR_INPUT
        pa : POINTER TO SMC_NC_GArgument;
    END_VA
    RVAR_OUTPUT
        eError : SMC_ERROR;
    END_VAR
    VAR
        g : BOOL;
    END_VAR
    
    g := pa[0].argValue.bValue;
    
    result.argType := pa[1].argType;
    
    CASE result.argType OF
    SMC_GVAR_Type.T_BOOL:
        result.argValue.bValue := SEL(g, pa[1].argValue.bValue, pa[2].argValue.bValue);
    
    SMC_GVAR_Type.T_STRING:
        result.argValue.sValue := SEL(g, pa[1].argValue.sValue, pa[2].argValue.sValue);
    
    SMC_GVAR_Type.T_LREAL:
        result.argValue.fValue := SEL(g, pa[1].argValue.fValue, pa[2].argValue.fValue);
    
    ELSE
        eError := SMC_INVALID_PARAMETER;
    END_CASE

的配置 SMC_ReadNCFile2

的一个实例 CNC_Sel 函数块是在 GVL_CNCFunctions 全局变量列表。

一个数组 aCNCFunctions 长度为 1 的使用功能块的名称和实例进行初始化。然后将该数组链接到表中 funTable 类型的 SMC_NC_GFunctionTable

aCNCFunctions : ARRAY[0..0] OF SMC_NC_GFunction :=
    [(stName:= 'SEL', iFunc:= GVL_CNCFunctions.g_Sel)];

funTable : SMC_NC_GFunctionTable :=
    (numFunctions:= 1,     pFunction:= ADR(aCNCFunctions)) ;

最后,将此表传递给 SMC_ReadNCFile2 功能块:

rncf2 : SMC_ReadNCFile2 := (bParenthesesAsComments:= FALSE);

[...]

rncf2(
    bExecute:= TRUE,
    sFileName:= sFileName,
    pCustomFunTable:= ADR(funTable),
    pvl:= ADR(varList));

调试

  1. 生成应用程序并将其下载到控制器。

  2. 启动应用程序,切换到可视化,然后按 Start。你可以使用 Longline 用于设置变量值的单选按钮 $LONGLINE$ 在 G 代码中 TRUE 或者 FALSE